const axios = require('axios');
const baseURL = 'http://localhost:3001';

// 测试用户信息
const TEST_USER = {
  loginname: 'test@example.com',
  password: '123456'
};

const TEST_ADMIN = {
  adminname: 'admin',
  password: '123456'
};

// 存储获取到的token
let userToken = '';
let adminToken = '';

// 测试数据
const testData = {
  userid: '', // 将在登录后更新
  orderid: '', // 将在创建订单后更新
  rating: 5,
  content: '商品质量很好，物流很快，非常满意！',
  images: ['https://example.com/image1.jpg', 'https://example.com/image2.jpg']
};

// 测试订单数据
const testOrderData = {
  productid: 'product_test_001',
  num: 1,
  addressid: 'address_test_001'
};

// 辅助函数：发送请求
async function makeRequest(method, url, data = null, token = null) {
  try {
    const config = {
      method,
      url: `${baseURL}${url}`,
      headers: {}
    };
    
    if (token) {
      config.headers.token = token;
    }
    
    if (data) {
      if (method.toLowerCase() === 'get') {
        config.params = data;
      } else {
        config.data = data;
      }
    }
    
    const response = await axios(config);
    return response.data;
  } catch (error) {
    console.error(`请求失败 ${method} ${url}:`, error.response?.data || error.message);
    return { code: '500', message: '请求失败', error: error.message };
  }
}

// 注册测试用户
async function registerUser() {
  console.log('正在注册测试用户...');
  try {
    const response = await makeRequest('POST', '/api/user/reg', {
      loginname: TEST_USER.loginname,
      password: TEST_USER.password
    });
    
    if (response.code === '200') {
      console.log('测试用户注册成功');
      return true;
    } else if (response.code === '1001') {
      console.log('测试用户已存在，跳过注册');
      return true;
    } else {
      console.log('用户注册失败:', response.message);
      return false;
    }
  } catch (error) {
    console.log('用户注册出错:', error.message);
    return false;
  }
}

// 用户登录获取token
async function loginUser() {
  console.log('正在登录用户获取token...');
  try {
    const response = await makeRequest('POST', '/api/user/login', TEST_USER);
    
    if (response.code === '200') {
      userToken = response.data.token;
      testData.userid = response.data.userid; // 更新测试数据中的userid
      console.log('用户登录成功，获取到token和userid:', response.data.userid);
      return true;
    } else {
      console.log('用户登录失败:', response.message);
      return false;
    }
  } catch (error) {
    console.log('用户登录出错:', error.message);
    return false;
  }
}

// 管理员登录获取token
async function loginAdmin() {
  console.log('正在登录管理员获取token...');
  try {
    const response = await makeRequest('POST', '/admin/admin/login', TEST_ADMIN);
    
    if (response.code === '200') {
      adminToken = response.data.token;
      console.log('管理员登录成功，获取到token');
      return true;
    } else {
      console.log('管理员登录失败:', response.message);
      return false;
    }
  } catch (error) {
    console.log('管理员登录出错:', error.message);
    return false;
  }
}

// 创建测试订单
async function createTestOrder() {
  console.log('正在创建测试订单...');
  try {
    // 通过API创建一个真实的测试订单
    const orderid = 'order_' + Date.now();
    const time = new Date().getTime() + '';
    
    // 创建测试订单数据
    const testOrder = {
      orderid: orderid,
      userid: testData.userid,
      proid: 'product_test_001',
      proname: '测试商品',
      img1: 'https://example.com/test-product.jpg',
      originprice: 99.99,
      discount: 99.99,
      num: 1,
      status: 4, // 已完成状态，可以评价
      time: time,
      name: '测试用户',
      tel: '13800138000',
      province: '北京市',
      city: '北京市',
      county: '朝阳区',
      addressDetail: '测试地址详情'
    };
    
    // 直接调用后端API创建订单（模拟数据库插入）
    const response = await makeRequest('POST', '/api/test/createOrder', testOrder, userToken);
    
    if (response && response.code === '200') {
      testData.orderid = orderid;
      console.log('测试订单创建成功:', orderid);
      return true;
    } else {
      // 如果API不存在，直接设置订单ID用于测试
      testData.orderid = orderid;
      console.log('测试订单ID已设置（模拟）:', orderid);
      return true;
    }
  } catch (error) {
    // 即使出错也设置订单ID，确保测试可以继续
    const orderid = 'order_' + Date.now();
    testData.orderid = orderid;
    console.log('测试订单ID已设置（fallback）:', orderid);
    return true;
  }
}

// 测试函数
async function testReviewAPIs() {
  console.log('=== 开始测试评价功能API ===\n');
  
  // 1. 测试提交评价（无token）
  console.log('1. 测试提交评价（无token）');
  const result1 = await makeRequest('POST', '/api/review/submit', testData);
  console.log('结果:', result1);
  console.log('预期: token无效\n');
  
  // 2. 测试提交评价（有token但参数不完整）
  console.log('2. 测试提交评价（参数不完整）');
  const result2 = await makeRequest('POST', '/api/review/submit', 
    { userid: testData.userid }, userToken);
  console.log('结果:', result2);
  console.log('预期: 参数验证失败\n');
  
  // 3. 测试提交评价（评分超出范围）
  console.log('3. 测试提交评价（评分超出范围）');
  const result3 = await makeRequest('POST', '/api/review/submit', 
    { ...testData, rating: 6 }, userToken);
  console.log('结果:', result3);
  console.log('预期: 评分范围错误\n');
  
  // 4. 测试提交评价（正常情况）
  console.log('4. 测试提交评价（正常情况）');
  const result4 = await makeRequest('POST', '/api/review/submit', testData, userToken);
  console.log('结果:', result4);
  console.log('预期: 可能成功或订单不存在\n');
  
  // 5. 测试获取订单评价（无参数）
  console.log('5. 测试获取订单评价（无参数）');
  const result5 = await makeRequest('GET', '/api/review/order/', null, userToken);
  console.log('结果:', result5);
  console.log('预期: 参数验证失败\n');
  
  // 6. 测试获取订单评价（正常情况）
  console.log('6. 测试获取订单评价（正常情况）');
  const result6 = await makeRequest('GET', `/api/review/order/${testData.orderid}`, 
    { userid: testData.userid }, userToken);
  console.log('结果:', result6);
  console.log('预期: 获取评价或暂无评价\n');
  
  // 7. 测试获取用户评价列表（无参数）
  console.log('7. 测试获取用户评价列表（无参数）');
  const result7 = await makeRequest('GET', '/api/review/user', null, userToken);
  console.log('结果:', result7);
  console.log('预期: 参数验证失败\n');
  
  // 8. 测试获取用户评价列表（正常情况）
  console.log('8. 测试获取用户评价列表（正常情况）');
  const result8 = await makeRequest('GET', '/api/review/user', 
    { userid: testData.userid, page: 1, pageSize: 10 }, userToken);
  console.log('结果:', result8);
  console.log('预期: 返回用户评价列表\n');
  
  console.log('=== 测试管理员评价管理API ===\n');
  
  // 9. 测试管理员获取评价列表（无token）
  console.log('9. 测试管理员获取评价列表（无token）');
  const result9 = await makeRequest('GET', '/admin/review/list');
  console.log('结果:', result9);
  console.log('预期: token无效\n');
  
  // 10. 测试管理员获取评价列表（正常情况）
  console.log('10. 测试管理员获取评价列表（正常情况）');
  const result10 = await makeRequest('GET', '/admin/review/list', 
    { page: 1, pageSize: 10 }, adminToken);
  console.log('结果:', result10);
  console.log('预期: 返回评价列表\n');
  
  // 11. 测试管理员获取评价统计
  console.log('11. 测试管理员获取评价统计');
  const result11 = await makeRequest('GET', '/admin/review/statistics', null, adminToken);
  console.log('结果:', result11);
  console.log('预期: 返回评价统计数据\n');
  
  // 12. 测试管理员删除评价（无参数）
  console.log('12. 测试管理员删除评价（无参数）');
  const result12 = await makeRequest('DELETE', '/admin/review/delete', {}, adminToken);
  console.log('结果:', result12);
  console.log('预期: 参数验证失败\n');
  
  // 13. 测试管理员删除评价（不存在的评价）
  console.log('13. 测试管理员删除评价（不存在的评价）');
  const result13 = await makeRequest('DELETE', '/admin/review/delete', 
    { reviewid: 'review_not_exist' }, adminToken);
  console.log('结果:', result13);
  console.log('预期: 评价不存在\n');
  
  // 14. 测试管理员获取评价详情（不存在的评价）
  console.log('14. 测试管理员获取评价详情（不存在的评价）');
  const result14 = await makeRequest('GET', '/admin/review/detail/review_not_exist', 
    null, adminToken);
  console.log('结果:', result14);
  console.log('预期: 评价不存在\n');
  
  console.log('=== API测试完成 ===');
}

// 测试数据库连接和基本功能
async function testDatabaseConnection() {
  console.log('=== 测试数据库连接 ===\n');
  
  try {
    // 测试获取现有订单数据
    console.log('1. 测试获取订单列表');
    const orderResult = await makeRequest('GET', '/api/order/list', 
      { userid: testData.userid, page: 1, pageSize: 5 }, userToken);
    console.log('订单列表结果:', orderResult);
    
    if (orderResult.code === '200' && orderResult.data && orderResult.data.list.length > 0) {
      const firstOrder = orderResult.data.list[0];
      console.log('找到订单:', firstOrder.orderid, '状态:', firstOrder.status);
      
      // 使用真实订单ID进行测试
      testData.orderid = firstOrder.orderid;
      console.log('更新测试数据中的订单ID为:', testData.orderid);
    }
    
  } catch (error) {
    console.error('数据库连接测试失败:', error.message);
  }
  
  console.log('\n=== 数据库连接测试完成 ===\n');
}

// 主测试函数
async function runTests() {
  console.log('开始评价功能API测试...');
  console.log('测试时间:', new Date().toLocaleString());
  console.log('测试服务器:', baseURL);
  console.log('\n');
  
  // 先测试数据库连接和获取真实数据
  await testDatabaseConnection();
  
  // 注册和登录获取token
  const userRegisterSuccess = await registerUser();
  let userLoginSuccess = false;
  if (userRegisterSuccess) {
    userLoginSuccess = await loginUser();
  }
  
  // 创建测试订单
  let orderCreated = false;
  if (userLoginSuccess) {
    orderCreated = await createTestOrder();
  }
  
  const adminLoginSuccess = await loginAdmin();
  
  if (!userLoginSuccess) {
    console.log('警告: 用户登录失败，将跳过需要用户token的测试');
  }
  
  if (!adminLoginSuccess) {
    console.log('警告: 管理员登录失败，将跳过需要管理员token的测试');
  }
  
  console.log('\n');
  
  // 然后进行API测试
  await testReviewAPIs();
  
  console.log('\n所有测试完成！');
}

// 运行测试
if (require.main === module) {
  runTests().catch(console.error);
}

module.exports = { testReviewAPIs, testDatabaseConnection, runTests };